package com.xxxx.server.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xxxx.server.domain.MemberCourse;
import com.xxxx.server.domain.MemberCourseExample;
import com.xxxx.server.dto.MemberCourseDto;
import com.xxxx.server.dto.PageDto;
import com.xxxx.server.mapper.MemberCourseMapper;
import com.xxxx.server.util.CopyUtil;
import com.xxxx.server.util.UuidUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@Service
public class MemberCourseService {

    @Resource
    private MemberCourseMapper memberCourseMapper;

    /**
     * 获取会员课程报名（分页）
     * @param pageDto
     */
    public void list(PageDto pageDto) {
        PageHelper.startPage(pageDto.getPage(), pageDto.getSize());

        MemberCourseExample memberCourseExample = new MemberCourseExample();
        List<MemberCourse> memberCourseList = memberCourseMapper.selectByExample(memberCourseExample);

        PageInfo<MemberCourse> pageInfo = new PageInfo<>(memberCourseList);
        pageDto.setTotal(pageInfo.getTotal());

        List<MemberCourseDto> memberCourseDtoList = CopyUtil.copyList(memberCourseList, MemberCourseDto.class);
        pageDto.setList(memberCourseDtoList);
    }

    /**
     * 保存会员课程报名(根据有无id判断是新增会员课程报名还是保存会员课程报名)
     * @param memberCourseDto
     */
    public void save(MemberCourseDto memberCourseDto) {
        MemberCourse memberCourse = CopyUtil.copy(memberCourseDto, MemberCourse.class);
        if (StringUtils.isEmpty(memberCourseDto.getId())) {
            this.insert(memberCourse);
        } else {
            this.update(memberCourse);
        }
    }

    /**
     * 新增会员课程报名
     * @param memberCourse
     */
    private void insert(MemberCourse memberCourse) {
        Date now = new Date();
        memberCourse.setId(UuidUtil.getShortUuid());
        memberCourse.setAt(now);
        memberCourseMapper.insert(memberCourse);
    }

    /**
     * 更新会员课程报名（根据id）
     * @param memberCourse
     */
    private void update(MemberCourse memberCourse) {
        memberCourseMapper.updateByPrimaryKey(memberCourse);
    }

    /**
     * 删除会员课程报名（根据id）
     * @param id
     */
    public void delete(String id) {
        memberCourseMapper.deleteByPrimaryKey(id);
    }

    /**
     * 课程报名
     * @param memberCourseDto
     * @return
     */
    public MemberCourseDto enroll(MemberCourseDto memberCourseDto) {
        // 先看在数据库里有记录没
        MemberCourse memberCourseDB = this.select(memberCourseDto.getMemberId(), memberCourseDto.getCourseId());
        if (memberCourseDB == null) {
            MemberCourse memberCourse = CopyUtil.copy(memberCourseDto, MemberCourse.class);

            // TODO 对接第三方支付, 如果支付成功, 再插入报名表

            this.insert(memberCourse);
            // 将数据库信息全部返回, 包括id, at
            return CopyUtil.copy(memberCourse, MemberCourseDto.class);
        } else {
            return CopyUtil.copy(memberCourseDB, MemberCourseDto.class);
        }
    }

    /**
     * 根据memberId和courseId查询记录
     * @param memberId
     * @param courseId
     * @return
     */
    public MemberCourse select(String memberId, String courseId) {
        MemberCourseExample example = new MemberCourseExample();
        example.createCriteria()
                .andMemberIdEqualTo(memberId)
                .andCourseIdEqualTo(courseId);
        List<MemberCourse> memberCourseList = memberCourseMapper.selectByExample(example);

        if (CollectionUtils.isEmpty(memberCourseList)) {
            return null;
        } else {
            return memberCourseList.get(0);
        }
    }

    /**
     * 获取会员的报名信息
     * @param memberCourseDto
     * @return
     */
    public MemberCourseDto getEnroll(MemberCourseDto memberCourseDto) {
        MemberCourse memberCourse = this.select(memberCourseDto.getMemberId(), memberCourseDto.getCourseId());
        return CopyUtil.copy(memberCourse, MemberCourseDto.class);
    }
}
